<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
    <body>
        General API that defines the graph structure.
        <p>
            API is providing a complete graph data structure that has the following
            features:
        <ul><li>Directed, Undirected and Mixed graphs support</li>
            <li>Easy iterable structure</li>
            <li>Thread-safe</li>
            <li>Hierarchical graphs, graphs within graphs support</li>
            <li>Automatic meta-edges calculation</li>
            <li>Subscrive to graph events</li>
            <li>Multi-view, host sub graphs</li></ul>
    </p>
    <p>
        The <code>Graph</code> interface has classical features needed for graph
        algorithms and is simplifying accesses by returning <code>NodeIterable</code> and
        <code>EdgeIterable</code>. The internal data model is flexible with the
        type of graph (directed, undirected or mixed) and allows to get any type
        of graph regardless to its nature. For instance its totally possible to
        get an undirected graph, even if all edges are directed and the contrary.
        No convert operations has to be performed because <code>Graph</code>
        interfaces are only accessors. All <code>Graph</code> interfaces
        (<code>DirectedGraph</code>, <code>UndirectedGraph</code>,
        <code>HierarchicalGraph</code>, ...) can ge get from the graph model.
        Therefore on the client side, <code>GraphModel</code> is the only object
        to keep in memory. For instance to iterate over nodes, you first ask for a
        new <code>Graph</code> object to the model and then call <code>getNodes()</code>.
    </p>
    <p>The structure is securized by a read-write lock. That means multiple
        threads can read the graph at the same moment, but writing is exclusive. If
        a thread is currently updating the graph, readers have to wait. Most of the
        time the locking will be transparent but it can also be controlled for more
        advanced operations.</p>
    <p>This graph structure API differs slightly from others about hierarchical
        graphs and propose an efficient automatic <b>meta-edges</b> calculation. The basic
        idea is that the hierarchy defines a tree of nodes and a marker for each node
        to flatten the representation. A marked node cannot have any ancestor or
        descendants be marked as well. When a node is unmarked and his children are
        marked we call this <b>expand</b>. The contrary operation is <b>retract</b>.
        The expand and retract operations are available in the API, and let users
        navigate in <b>multilevels</b> with ease. Therefore group of nodes is unified
        in the model, and represents a node that has children in the hierarchy. When
        a node is not a leaf, it is called a meta-node. In addition, users can access
        meta-edges that comes from the current expand/retract positionning. Meta-edges
        are edges that connects group of nodes according to edges between nodes.
        If computed manually, that would require costly procedure. The hierarchical
        graph support currently has only a single limitation, a node can only have
        one parent.
    </p>
    <p>
        The multi-view support allows to define views on the graph and thus create
        sub-graphs. The API proposes, for a <code>GraphModel</code> to have several
        <code>GraphView</code> on the same nodes and edges. One can get graphs
        exactly in the same way on sub-graphs than on graphs, and therefore execute
        the same operations.
    </p>
</body>
</html>

